/**
 * @file template_type_check.hpp
 * @author 逆流 (1171267147@qq.com)
 * @brief 模板类型检查
 * @version 0.1
 * @date 2024-07-30
 *
 * @copyright Copyright (c) 2024
 *
 */
#pragma once
#include <iostream>
#include <type_traits>

namespace stl {

// 定义一个模板结构，用于检查类型是否支持<<运算符
// 默认继承false_type，表示不支持ostream操作
template <typename T, typename = void>
struct has_ostream_operator : std::false_type {};

// has_ostream_operator的特化版本，表示类型T支持<<操作
// `declval<U>()`是一个占位符对象，用于模拟类型U的对象
// 这里模拟了T的对象对iostream进行<<操作，如果T确实重载了<<，那么这个操作就是合法的，模板可以被实例化；否则不可编译
template <typename T>
struct has_ostream_operator<T, decltype(void(std::declval<std::iostream&>() << std::declval<T>()))> : std::true_type {};
}  // namespace stl
